package cn.tedu.justone.pack01;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */
public class Demo05_方法示例_lockInterruptibly {
    //常用方法五：lockInterruptibly();
    //常用方法五：lockInterruptibly();
    //常用方法五：lockInterruptibly();
    // 1,先尝试获取锁，如果获得就执行重要任务。如果没有获得一直等，
    //   直到等到 或 被t.interrupt()中断等待，就不再等了。
    // 2,可以把这个方法理解成："等待"能够被打断的lock();
    //   或 "等待时间无限长"的tryLock()。
    // 3,本方法没有返回值，用法与 lock()一致。
    // 4,小白说话：在 void lock()前等待的线程是不会放弃等待的，
    //   而在 void lockInterruptibly();
    //   前等待的线程能够在 t.interrupt();执行时放弃等待。

    public static void main(String[] args) {
        Table05 table = new Table05();

        Thread t1 = new Thread("男生"){
            @Override
            public void run() {
                table.eatMi();
            }
        };

        Thread t2 = new Thread("女生"){
            @Override
            public void run() {
                table.eatMi();
            }
        };

        t1.start();
        t2.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("劝告女生放弃等待");
        t2.interrupt();
    }
}

class Table05{

    Lock myLock = new ReentrantLock();
    public void eatMi(){
        try {
            myLock.lockInterruptibly();//---------------上锁
            String name = Thread.currentThread().getName();
            System.out.println(name + "获得了锁，正在执行重要任务");
            mySleep(3000 * 1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            String name = Thread.currentThread().getName();
            System.out.println(name + "释放了锁 或 放弃了等待");
            myLock.unlock();//---------------------------释放锁
        }
    }

    //为了让代码更优雅，编写统一的休眠方法
    public static void mySleep(long m){
        try {
            Thread.sleep(m);
        } catch (InterruptedException e) {
            //e.printStackTrace();
            System.out.println("---阻塞被打断");
        }
    }
}
